
import 'package:flutter/cupertino.dart';
import 'package:math_expressions/math_expressions.dart';

class MathUtil{

  //计算公式
  static  countExpression(var expression){
    //处理二元表达式   如  25>30?12:24
    if (expression.contains('?') && expression.contains(':')) {
      final questionMarkIndex = expression.indexOf('?');
      final colonIndex = expression.indexOf(':');
      // 提取条件、真值、假值
      final conditionStr = expression.substring(0, questionMarkIndex).trim();
      final trueValueStr = expression.substring(questionMarkIndex + 1, colonIndex).trim();
      final falseValueStr = expression.substring(colonIndex + 1).trim();
      double trueValue=countValueExpression(trueValueStr);
      double falseValue=countValueExpression(falseValueStr);
      bool conditionResult = _parseCondition(conditionStr);
      return conditionResult?trueValue:falseValue;
    }else{
      return countValueExpression(expression);
    }
  }

  // 解析条件表达式（如 "a>b"）
  static bool _parseCondition(String condition) {
    // 支持 >、<、>=、<=、== 等运算符
    final operators = ['>=', '<=', '==', '>', '<'];
    for (var op in operators) {
      if (condition.contains(op)) {
        final parts = condition.split(op).map((e) => e.trim()).toList();
        final left = countValueExpression(parts[0]);
        final right = countValueExpression(parts[1]);

        switch (op) {
          case '>': return left > right;
          case '<': return left < right;
          case '>=': return left >= right;
          case '<=': return left <= right;
          case '==': return left == right;
          default: return false;
        }
      }
    }
    return false;
  }

  static  countValueExpression(var expression){
    try{
      ExpressionParser p = GrammarParser();
      ContextModel cm = ContextModel();

      // 解析表达式
      Expression exp = p.parse(expression);
      var evaluator = RealEvaluator(cm);
      // 计算表达式的值
      double evalResult = exp.evaluate(EvaluationType.REAL, cm);
      return evalResult;
    }catch(e ){
      debugPrint(expression);
      return 0.0;
    }
  }

 static String formatDouble(double value, int decimalPlaces) {
    // 检查是否为整数（没有小数部分或小数部分为0）

    if (value == value.roundToDouble()) {
      return value.round().toString();
    } else {
      // 有小数部分，按指定位数格式化
      // 使用字符串插值并指定小数位数
      return value.toStringAsFixed(decimalPlaces);
    }
  }

  static bool isNumeric(String value) {
    // 尝试将字符串解析为数字（int或double）
    return num.tryParse(value) != null;
  }


  static num? parseNumValue(dynamic value) {
    if (value == null) return null;

    // 如果已经是数字类型，直接返回
    if (value is num) return value;

    // 如果是字符串，尝试解析为数字
    if (value is String) {
      // 先尝试解析为 int
      int? intVal = int.tryParse(value);
      if (intVal != null) return intVal;

      // 再尝试解析为 double
      return double.tryParse(value);
    }

    // 无法解析的类型返回 null
    return null;
  }
}